summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2016-12-01 09:51:06 -0700
committerMike Buland <eichlan@xagasoft.com>2016-12-01 09:51:06 -0700
commit4efeaef41e57b25d6004e7f91828f7d5b5cd0b20 (patch)
tree19986986ab7e4638547588094fcc19275cfe9ef3
parent3015ea4677201060777435cf76815e898d221f8c (diff)
downloadclic-4efeaef41e57b25d6004e7f91828f7d5b5cd0b20.tar.gz
clic-4efeaef41e57b25d6004e7f91828f7d5b5cd0b20.tar.bz2
clic-4efeaef41e57b25d6004e7f91828f7d5b5cd0b20.tar.xz
clic-4efeaef41e57b25d6004e7f91828f7d5b5cd0b20.zip
Forgot assignment and negation. They both work now.
That was actually really cool. Now to clean up the debugging code and write the execution engine.
-rw-r--r--src/parser.cpp32
-rw-r--r--src/token.h48
2 files changed, 51 insertions, 29 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index f88ffe7..04a81ce 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -79,12 +79,7 @@ void Parser::expr()
79 " " << lex[1] << 79 " " << lex[1] <<
80 Bu::sio.nl; 80 Bu::sio.nl;
81 shift( lex[0] ); 81 shift( lex[0] );
82 if( lex[1].eType == Token::tPlus || 82 if( lex[1].eType&Token::mMetaOperator )
83 lex[1].eType == Token::tMinus ||
84 lex[1].eType == Token::tDivide ||
85 lex[1].eType == Token::tMultiply ||
86 lex[1].eType == Token::tModulus ||
87 lex[1].eType == Token::tEquals )
88 { 83 {
89 if( getPriority(lex[1].eType) <= 84 if( getPriority(lex[1].eType) <=
90 getPriority(t.eType) ) 85 getPriority(t.eType) )
@@ -117,9 +112,17 @@ void Parser::expr()
117 printState("no next op"); 112 printState("no next op");
118 } 113 }
119 } 114 }
120 else 115 else if( lex[0].eType == Token::tMinus )
121 { 116 {
122 Bu::println("???"); 117 // This is negation
118 Bu::sio << "next token: " << lex[0] << Bu::sio.nl;
119 printState("inline-negate");
120 exprP();
121 printState("inline-negate-post");
122 shift( t );
123 printState("inline-negate-post2");
124
125 Bu::sio << "??? " << lex[0] << Bu::sio.nl;
123 } 126 }
124 } 127 }
125 break; 128 break;
@@ -171,7 +174,8 @@ void Parser::exprP()
171 case Token::tMinus: 174 case Token::tMinus:
172 lex.nextToken(); 175 lex.nextToken();
173 exprP(); 176 exprP();
174 shift( Token( Token::tNegate ) ); 177 shift( Token( Token::tNegate ) );
178 reduce();
175 break; 179 break;
176 } 180 }
177} 181}
@@ -310,6 +314,16 @@ void Parser::reduce()
310 shift( Token( Token::tComputedValue ) ); 314 shift( Token( Token::tComputedValue ) );
311 break; 315 break;
312 316
317 case Token::tNegate:
318 {
319 Token t = tsParse.peekPop();
320 if( t.eType != Token::tComputedValue )
321 tsScript.append( t );
322 tsScript.append( tOp );
323 shift( Token( Token::tComputedValue ) );
324 }
325 break;
326
313 case Token::tCloseParen: 327 case Token::tCloseParen:
314 if( tsParse.peek().eType != Token::tComputedValue ) 328 if( tsParse.peek().eType != Token::tComputedValue )
315 { 329 {
diff --git a/src/token.h b/src/token.h
index 072a96b..4ad1136 100644
--- a/src/token.h
+++ b/src/token.h
@@ -13,26 +13,34 @@ class Token
13public: 13public:
14 enum Type 14 enum Type
15 { 15 {
16 tNumber, 16 tNumber = 0x1001,
17 tVariable, 17 tVariable = 0x2002,
18 tCommand, 18 tCommand = 0x2003,
19 tPlus, 19 tPlus = 0x4004,
20 tMinus, 20 tMinus = 0x4005,
21 tDivide, 21 tDivide = 0x4006,
22 tMultiply, 22 tMultiply = 0x4007,
23 tModulus, 23 tModulus = 0x4008,
24 tOpenParen, 24 tOpenParen = 0x8009,
25 tCloseParen, 25 tCloseParen = 0x800a,
26 tEquals, 26 tEquals = 0x400b,
27 tString, 27 tString = 0x200c,
28 28
29 tNegate, 29 tNegate = 0x800d,
30 tEndOfLine, 30 tEndOfLine = 0x010e,
31 31
32 tEndOfInput, 32 tEndOfInput = 0x010f,
33 33
34 tUninitialized, 34 tUninitialized = 0x0110,
35 tComputedValue 35 tComputedValue = 0x0111,
36
37
38 mMetaNumber = 0x1000,
39 mMetaString = 0x2000,
40 mMetaOperator = 0x4000,
41 mMetaAltOp = 0x8000,
42 mMetaMeta = 0x0100,
43
36 }; 44 };
37 45
38 Token(); 46 Token();